//
//  XrLayout.m
//  UI27-自定义Layout
//
//  Created by XuRui on 16/1/13.
//  Copyright © 2016年 www.lanou3g.com 蓝鸥科技. All rights reserved.
//

#import "XrLayout.h"

//延展
@interface XrLayout ()
@property (nonatomic, retain) NSMutableDictionary *columYDic;/**< 保存每一列Y值 */
@property (nonatomic, retain) NSMutableArray *attributesArr; /**< 布局属性数组 */
@end

@implementation XrLayout
// 控制collectionView的布局
// 本质就是计算 每一个item的布局信息(x y w h)
// 不规则瀑布流实现原理:
// 找到当前的最短列 设置item的坐标

- (void)dealloc
{
    [_columYDic release];
    [_attributesArr release];
    
    [super dealloc];
}

#pragma mark - 初始化
- (instancetype)init
{

    self = [super init];
    if (self) {
        self.columYDic = [NSMutableDictionary dictionary];
        self.attributesArr = [NSMutableArray array];
   
    }
    return self;
}




#pragma mark - 方法1
//当collectionView布局item时 第一个执行的方法
- (void)prepareLayout
{
    //重写layout中的方法 首先必须调用父类
    [super prepareLayout];
    
#warning 4.refresh mistake must init
    
    //self.attributesArr = [NSMutableArray array];
    [_attributesArr removeAllObjects];
    
   //初始化每个item的位置
    //通过Y值判断最短列
    //通过列数决定Y值字典中 需要的键值对
    for (NSInteger i = 0; i < _columCounts; i++) {
        
        //key
        NSString *key = [NSString stringWithFormat:@"%ld", i];
        //value
       // _columYDic[key] = @(_edgeInsets.top);
        [_columYDic setObject:@(_edgeInsets.top) forKey:key];
        
        
    }
    //获取collectonView中的item中的个数
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
    //遍历得到每个item 设置位置信息
    for (NSInteger i = 0; i < itemCount; i++) {
        //设置位置信息
        [self setItemFrameWithIndex:i];
        
    }

}

#pragma mark - 方法2 单个item位置设置
- (void)setItemFrameWithIndex:(NSInteger)index
{

    //1.获取最短列
    //2.设置每个item的frame
    
    //定义临时变量 始终记录最小列下标
    NSString *minColum = @"0";
    //遍历保存y值的字典
    for (NSString *y in _columYDic) {
        
        //找到最短列
        //从字典中根据最小下标获取的Y值
        //y.doubleValue 遍历到的每一列对应的Y值
        if ([_columYDic[minColum] doubleValue] > [_columYDic[y] doubleValue]) {
            minColum = y;
            
        }
    }
  //分别计算frame值
    //宽 = (总宽 - 左边距 - 右边距 - (列数-1)*间距 )/列数
    CGFloat w = (self.collectionView.frame.size.width -
   _edgeInsets.left - _edgeInsets.right - (_columCounts - 1) * _columSpace )/ _columCounts;
    
    //x = 左边距 + (宽 + 列间距)*列数(最小列号)
    CGFloat x = _edgeInsets.left + (w + _columSpace) * minColum.doubleValue;
    
    //通过item下标 创建位置对象
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:index inSection:0];
    //获取高度
    //通过协议在VC中求得H 传递在layout中
    CGFloat h = [self.delegate layout:self heightForItemAtIndexPath:indexPath width:w];
    //获取Y值
    CGFloat y = [_columYDic[minColum]doubleValue];
    //更新 Y = 旧Y + 高 + 行间距
    [_columYDic setObject:@(y + h + _rowSpace) forKey:minColum];
   // _columYDic[minColum] =@(y + h + _rowSpace);
    
    //每一个item的布局属性 包含frame/bounds/size
    //根据indexpath获取对应的属性
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    //添加frame
    attributes.frame = CGRectMake(x, y, w, h);
    //保存在数组
    [_attributesArr addObject:attributes];
    
}
#pragma mark - 方法3 布局属性
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{

    
    return _attributesArr;
    
}


#pragma mark - 方法4 设置滚动范围
- (CGSize)collectionViewContentSize
{
   // [self.delegate Arr:_attributesArr];
  //第0列最大Y
    NSString *maxY = @"0";
    //获取最大Y值所在列号
    for (NSString *y in _columYDic) {
        if ([_columYDic[y]doubleValue ] > [_columYDic[maxY]doubleValue]) {
            maxY = y;
        }
    }
    //内容高度
    CGFloat h = [_columYDic[maxY] doubleValue]+ _edgeInsets.bottom;
    return CGSizeMake(0, h);
    
}





@end

